import axios from 'axios';
// import { ElMessage, ElMessageBox } from 'element-plus';
import { portalMessageSend } from "@ncp-web/portal-communication"
// import { Session } from '/@/utils/storage';
import Cookies from 'js-cookie'
import qs from 'qs';

import type { AxiosInstance } from 'axios';

// 配置新建一个 axios 实例
const service: AxiosInstance = axios.create({
    baseURL: import.meta.env.VITE_API_URL,
    timeout: 50000,
    headers: { 'Content-Type': 'application/json' },
    paramsSerializer: {
        serialize(params) {
            return qs.stringify(params, { allowDots: true });
        },
    },
});

// 添加请求拦截器
service.interceptors.request.use(
    (config) => {
        // 在发送请求之前做些什么 token
        // if (Session.get('token')) {
        // 	config.headers!['Authorization'] = `DavyJonesZ ${Session.get('token')}`;
        // }
        // return config;


        const xsrfToken = Cookies.get('XSRF-TOKEN')
        config.headers['X-XSRF-TOKEN'] = xsrfToken
        if (config && config.headers.polling) return config
        return config
    },
    (error) => {
        // 对请求错误做些什么
        return Promise.reject(error);
    }
);

// 添加响应拦截器
service.interceptors.response.use(
    (res) => {
        // 对响应数据做点什么
        // 获取返回数据
        const data = res.data
        console.log(data,'datasa')
        // 如果是附件下载类的请求则直接返回二进制数据
        if (
            res.headers &&
            res.headers['content-disposition'] &&
            res.headers['content-disposition'].includes('attachment;filename=')
        ) {
            return data
            // 二级代码
        } else if (/(.*)selectcodes\/(.*)/.test(res.config.url!)) {
            res.data = res.data.data
            return res
        } else if (data instanceof ArrayBuffer) {
            return data
        } else if (
            res.headers.hasOwnProperty('content-type') &&
            !res.headers['content-type'].startsWith('application/json')
        ) {
            return res
        } else {
            if (data.hasOwnProperty('code')) {
                if (data.code == '-4') {
                    // 超时，直接将信息发送给 portal，hsa-seed 不做任何处理
                    portalMessageSend.notifySessionTimeout({ content: 'session timeout' } as any)
                } else if (data.code != '0') {
                    return Promise.reject(new Error(data.message || 'Error'))
                } else {
                    return data
                }
            } else {
                return Promise.reject(new Error('返回数据格式不正确！'))
            }
        }

        // if (res.code && res.code !== 0) {
        //     // `token` 过期或者账号已在别处登录
        //     if (res.code === 401 || res.code === 4001) {
        //         // Session.clear(); // 清除浏览器全部临时缓存
        //         window.location.href = '/'; // 去登录页
        //         ElMessageBox.alert('你已被登出，请重新登录', '提示', {})
        //             .then(() => { })
        //             .catch(() => { });
        //         return Promise.reject(service.interceptors.res);
        //     } else {

        //         return res;
        //     }

        // } else {

        //     return res;
        // }
    },
    (err) => {
        // // 对响应错误做点什么
        // if (err.message.indexOf('timeout') != -1) {
        // 	ElMessage.error('网络超时');
        // } else if (err.message == 'Network Error') {
        // 	ElMessage.error('网络连接错误');
        // } else {
        // 	if (err.response.data) ElMessage.error(err.response.statusText);
        // 	else ElMessage.error('接口路径找不到');
        // }
        // return Promise.reject(err);

        // 对于客户端的错误进行提示，服务端的错误一律提示“网络错误”
        if (err.response.status == '400') {
            return Promise.reject(new Error('请求有误，当前请求无法被服务器理解！'))
        } else if (err.response.status == '401') {
            return Promise.reject(new Error('当前请求需要用户验证！'))
        } else if (err.response.status == '403') {
            return Promise.reject(new Error('该用户无权访问此接口！'))
        } else if (err.response.status == '404') {
            return Promise.reject(
                new Error('请求所希望得到的资源未被在服务器上发现！')
            )
        } else if (err.response.status == '405') {
            return Promise.reject(
                new Error('请求有误，该请求方法不能被用于请求相应的资源。')
            )
        } else {
            return Promise.reject(new Error('网络错误！'))
        }
    }
);

// 导出 axios 实例
export default service;